#include "client.h"




/*
     跟好友聊天窗口
        input: msg - 消息
        output: `0` - send ok ; `-1` - send error ;
*/
void Chat(char* who)
{
    char buf[BUFFER_SIZE];
    msgdata msg;

    // 1. 设置动作
    // 群聊
    if(strcmp(who,"all") == 0)
        msg._act = _ChatGroup;
    // 私聊
    else
        msg._act = _ChatOne;

    // 2. 自己 id、对方 id
    strcpy(msg._acc,_myacc);
    strcpy(msg._who,who);

    while(1)
    {
        printf("> chating with %s: ",who);
        Gets(buf);

        // 1. 用户指令
        // 退出与某人聊天对话框
        if(strcmp(buf,"#quit")==0)  break;
        // 查看聊天记录
        if(strcmp(buf,"#record")==0)
        {
            PrintchatRecord(who);
            continue;
        }

        // 2. 封装聊天内容
        strcpy(msg._msg,buf);


//        printMsg(&msg);
        // 发给服务器
        Write(_sockfd, &msg, sizeof(msgdata));
        saveChatRecord(_myacc,msg._who,msg._msg);// 保存聊天记录
    }
}

/*
    登录后的聊天窗口
*/
void ChatWidget()
{
    char buf[USER_ACCOUNT];
    while(1)
    {
        // PREMIX ：printf("打印好友列表，供用户选择");
        memset( &buf, '\0', USER_ACCOUNT );

        printf("> please input chat with who: ");
        Gets(buf);
        if(!strcmp(buf,"quit"))  break;  // 退出登录后窗口
        Chat(buf);
    }
}

/*
    启动服务器
*/
int RunClient()
{
    struct sockaddr_in servaddr;

    _sockfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    inet_pton(AF_INET, "0", &servaddr.sin_addr);
    servaddr.sin_port = htons(PORT);

    Connect(_sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    // 初始化缓冲区
    memset(&chatRecordList,NULL,CHAT_RECORDS);

    pthread_t _ntid;

    // 创建子线程：用于接受服务器消息
    int err = pthread_create(&_ntid, NULL, thr_RecServerMsg, "new thread arg");
    if (err != 0)
    {
        fprintf(stderr, "can't create thread: %s\n", strerror(err));
        exit(1);
    }

    // 显示窗口
    LoginWidget();

    while(!_isLoginFlag);

    ChatWidget();

    Close(_sockfd);
    return 0;
}
